#include "AlmacenamientoDocs.h"

using namespace std;

// CONSTRUCTOR
AlmacenamientoDocs::AlmacenamientoDocs(char * modo) {

	string nombreArchivoIndiceDocs;

	nombreArchivoIndiceDocs = Entorno::Instance().getDataPath();
	nombreArchivoIndiceDocs += NOMBRE_ARCHIVO_INDICE_DOCS;
	nombreArchivoIndiceDocs += EXT_ARCHIVO;
	//cout << "AlmacenamientoDocs.cpp,13: nombreArchivoIndiceDocs: " << nombreArchivoIndiceDocs << endl;

	archivoIndiceDocs = fopen(nombreArchivoIndiceDocs.c_str(), modo);
	cantRegistros = 0;
	if (strcmp(modo, CREAR) == 0)
		fwrite((void *) &cantRegistros, sizeof(int), 1, archivoIndiceDocs);
		
	if ((strcmp(modo, ABRIR) == 0) || (strcmp(modo, MODIFICAR) == 0))
		fread((void *) &cantRegistros, sizeof(int), 1, archivoIndiceDocs);
}

// DESTRUCTOR
AlmacenamientoDocs::~AlmacenamientoDocs() {

	fseek(archivoIndiceDocs, 0, SEEK_SET);
	fwrite((void *) &cantRegistros, sizeof(int), 1, archivoIndiceDocs);
	fclose(archivoIndiceDocs);
}

// LEE UN REGISTRO DEL INDICE DE DOCUMENTOS
RegistroIndiceDocumentos * AlmacenamientoDocs::leerRegistroIndiceDocs(int posicion)
{
	RegistroIndiceDocumentos * regIndiceDocs = new RegistroIndiceDocumentos();
	
	// posicionamiento en el archivo
	fseek(archivoIndiceDocs, sizeof(int) + (RegistroIndiceDocumentos::sizeOf() * posicion), SEEK_SET);

	int offset = 0;
	float norma = 0; 
	
	// lectura del offset
	fread((void *)&offset, sizeof(int), 1, archivoIndiceDocs);
	
	// lectura de la norma
	fread((void *)&norma, sizeof(float), 1, archivoIndiceDocs);
	
	regIndiceDocs->setOffsetLexico(offset);
	regIndiceDocs->setNorma(norma);
	
	return regIndiceDocs;
}

// ESCRIBE UN REGISTRO DEL INDICE DE DOCUMENTOS
void AlmacenamientoDocs::escribirRegistroIndiceDocs(RegistroIndiceDocumentos * regIndiceDocs)
{
	int offsetLexicoDocs = regIndiceDocs->getOffsetLexico();
	float norma = regIndiceDocs->getNorma();
	
	fwrite((void *)&offsetLexicoDocs, sizeof(offsetLexicoDocs), 1, archivoIndiceDocs);
	fwrite((void *)&norma, sizeof(float), 1, archivoIndiceDocs);
	cantRegistros++;
}

// escribe la 'norma' del documento del cual se pasa la 'posicion'
void AlmacenamientoDocs::escribirNormaRegistro(int posicion, float norma) {
	
	// posicionamiento en el archivo
	// salta el header, 'posicion' registros y el int del que se actualiza
	fseek(archivoIndiceDocs, sizeof(int) + (RegistroIndiceDocumentos::sizeOf() * posicion) + sizeof(int), SEEK_SET);
	
	fwrite((void *)&norma, sizeof(float), 1, archivoIndiceDocs);
}

int AlmacenamientoDocs::getCantidadRegistros() {
	return this->cantRegistros;
}
